/*
 * hal_single_abs_encoder.h
 *
 *  Created on: 2025 Apr 8
 *      Author: SFLY
 */

#ifndef XTFOCLIB_HAL_DRIVERS_HAL_SINGLE_ABS_ENCODER_H_
#define XTFOCLIB_HAL_DRIVERS_HAL_SINGLE_ABS_ENCODER_H_
#include "bsp_timer.h"
#include "bsp_board_config.h"
#include "mod_math.h"

/** Single-turn Absolute Encoder Parameters *****************************************************/
typedef enum{
 XT_MOTOR_END_ENCODER =  0,  //编码器在电机本体端
 XT_REDUCER_END_ENCODER= 1,  //编码器在减速器输出端
}xt_hal_encoder_position;

typedef struct{
    int      raw_value;                    //编码器原始值
    float    encoderK;                     //原始值转换为弧度的系数（0-Res）-（0-2PI）
    float    invencoderK;                  //弧度转原始值的系数（0-2PI）-（0-Res）
}xt_hal_encoder_base_info_t;

typedef struct{
    xt_hal_encoder_base_info_t encoder_base_info;
    xt_hal_encoder_position encoder_pos;
    int      roundcnt;
    int      calib_value;                  //校准后编码器原始值(0-Res)
    int      calib_value_prev;             //校准后编码器原始值(0-Res)
    float    elec_theta;                   //电机端编码器获得的电角度
    float    elec_offset;                  //电机电角度为0时编码器值，只有编码器在电机端时才用的到
    float    multi_mech_theta;             //编码器多圈相对零点的角度
    float    abs_multi_mech_theta;         //编码器多圈绝对的角度
    float    mech_theta_offset;            //用户定义的机械零点的偏移值
    int8_t   orderdir;                     //电机顺时针旋转，编码器原始值是否增加，如果增加则为1，如果减少则为-1
    int offset_lut[LUT_N];                 //编码器偏心率校准值数组
    uint16_t (*encoder_read)();
    void (*encoder_set_elec_offset)(float,void*);
    void (*encoder_set_mech_offset)(float,void*);
    void (*encoder_set_order)(int8_t,void*);
    void (*encoder_reset)(void*);
    void (*encoder_update)(void*);
}xt_hal_motor_end_single_abs_encoder_t;


typedef struct
{
    xt_hal_encoder_base_info_t encoder_base_info;
    xt_hal_encoder_position encoder_pos;   //编码器在机械结构中的位置
    int      roundcnt;
    int      calib_value;                  //校准后编码器原始值(0-Res)
    int      calib_value_prev;             //校准后编码器原始值(0-Res)
    float    multi_mech_theta;             //编码器多圈相对零点的角度
    float    abs_multi_mech_theta;         //编码器多圈绝对的角度
    float    mech_theta_offset;            //用户定义的机械零点的偏移值
    int8_t   orderdir;                     //电机顺时针旋转，编码器原始值是否增加，如果增加则为1，如果减少则为-1
    uint16_t (*encoder_read)();
    void (*encoder_set_mech_offset)(float,void*);
    void (*encoder_set_order)(int8_t,void*);
    void (*encoder_reset)(void*);
    void (*encoder_update)(void*);
}xt_hal_reducer_end_single_abs_encoder_t;

void Hal_Single_Encoder_Init(xt_hal_motor_end_single_abs_encoder_t *mencoder,xt_hal_reducer_end_single_abs_encoder_t *rencoder);
void Hal_Motor_Encoder_SetElecOffset(float elecoffset,void* encoder_void_ptr);
void Hal_Motor_Encoder_SetMechOffset(float mechoffset,void* encoder_void_ptr);
void Hal_Motor_Encoder_SetOrderDir(int8_t orderdir,void* encoder_void_ptr);
void Hal_Motor_Encoder_Reset(void* encoder_void_ptr);
void Hal_Motor_Encoder_Update(void* encoder_void_ptr);
void Hal_Reducer_Encoder_SetMechOffset(float mechoffset,void* encoder_void_ptr);
void Hal_Reducer_Encoder_SetOrderDir(int8_t orderdir,void* encoder_void_ptr);
void Hal_Reducer_Encoder_Reset(void* encoder_void_ptr);
void Hal_Reducer_Encoder_Update(void* encoder_void_ptr);
#endif /* XTFOCLIB_HAL_DRIVERS_HAL_SINGLE_ABS_ENCODER_H_ */
